package Grafica;

import java.util.LinkedList;

/**
 *
 * @author robertoanzaldua
 */
public class Vertice implements java.io.Serializable{
    private static final long serialVersionUID = 4608851291328220550L;
    LinkedList<Vertice> vecinos;
    LinkedList<Vertice> copiaVecinos;
    private String ID;
    private String color;
    /** Contructor por omisión
    *
    */
    public Vertice(){

    }



    /**Nos regresa el color de este vértice
     *
     * @return
     */
    public String getColor(){
        return color;
    }

    public void marcaVertice(String color){
        this.color = color;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 29 * hash + (this.ID != null ? this.ID.hashCode() : 0);
        return hash;
    }

    /**Regresa los vecinos de este vértice
     *
     * @return <code>LinkedList<Vertice></code> La lista de vértices
     * adyacentes
     */
    public LinkedList<Vertice> ady(){
        return vecinos;
    }



    /**Regresa los vecinos de este vértice
     *
     * @return <code>LinkedList<Vertice></code> La lista de vértices
     * adyacentes
     */
    public LinkedList<Vertice> adyC(){
        return copiaVecinos;
    }

    /**Nos dice si el vértice v es adyacente a este vértice
     *
     * @param v Un vértice
     * @return <code>Boolean</code>
     */
    public boolean esAdyacente(Vertice v){
        for(Vertice u : vecinos)
            if(u.ID.equals(v.ID))
                return true;
        return false;
    }

    /**
     *
     * @param vecinos Los vértices a los que este vértice es adyacente.
     *
     */
    public Vertice(String ID, LinkedList<Vertice> adyacencias){
        this.ID = ID;
        this.vecinos = adyacencias;
    }


    /**Constructor, inicializa la lista de vecinos y asigna el nombre a este
     * vértice
     * @param ID El identificador de este vértice
     */
    public Vertice(String ID){
        this.ID = ID;
        vecinos = new LinkedList();
        copiaVecinos = new LinkedList();
    }


    /** Agrega un vecino a este vértice
     *
     * @param v El vecino a agregar
     */
    public void agrega(Vertice v){
        vecinos.add(v);
        copiaVecinos.add(v);
    }


    /**Método que elimina el primer vértice de la lista de vecinos
     * @return El vértice eliminado
     */
    public Vertice elimina(){
        if(copiaVecinos==null){
            copiaVecinos = vecinos;
            return null;
        }

        return copiaVecinos.removeFirst();
    }
    
    
   /**Método que elimina el vértice i de la lista de vecinos
     * @return El vértice eliminado
     */
    public boolean elimina(Vertice i){
        return vecinos.remove(i);
    }

    @Override
    public boolean equals(Object o){
        return this.ID().equals(((Vertice)o).ID());
    }




    /**Regresa el identificador de este vértice
     *
     * @return Una cadena que representa al identificador del vértice
     */
    public String ID(){
        return ID;
    }

    /**Método que obtiene el número asignado a este vértice.
     *
     * @return Regresa un int que representa el número asignado a este vértice
     */
    public int nV(){
        return Integer.parseInt(ID.substring(1));
    }

    /**Nos regresa el primer vértice disponible en la lista
     * de adyacencias.
     * @return Vertice El primer vértice vecino en la lista
     */
    public Vertice disp(){
        return vecinos.isEmpty() ? null : vecinos.getFirst();
    }



}
